home *** CD-ROM | disk | FTP | other *** search
/ NeXT Education Software Sampler 1992 Fall / NeXT Education Software Sampler 1992 Fall.iso / Mathematics / Notebooks / SigProc2.0 / CHANGES next >
Encoding:
Text File  |  1992-08-18  |  34.5 KB  |  767 lines

  1.                 Signal Processing Packages and Notebooks
  2.                     for the Mathematica Environment
  3.  
  4.                     Brian Evans and James McClellan
  5.                     Digital Signal Processing Group
  6.                     School of Electrical Engineering
  7.                     Georgia Institute of Technology
  8.                         Atlanta, GA  30332-0250
  9.  
  10.                      EMAIL: evans@eedsp.gatech.edu
  11.  
  12.  
  13.      Since the version of the signal processing packages released by
  14. The Mathematica Journal, I have made changes to just about every file.
  15. The major changes implemented by the new version of the signal
  16. processing packages are discussed in the SignalProcessingExamples
  17. notebook, but they are summarized here:
  18.  
  19.  
  20. -------------------------- Version 2.0 ----------------------------------
  21.  
  22. (1)   added object SignalPlot that plots the real and imaginary components
  23.       of a 1-D function simultaneously on the same plot, as well as
  24.       Dirac delta functions.  It also plots 2-D signals.  (The signal
  25.       processing packages already plot 1-D discrete-time functions in
  26.       lollipop style via DiscreteGraphics.)
  27.  
  28. (2)   the option Dialogue -> All now works for the forward bilateral Laplace
  29.       transform (which means that all transform rule bases can completely
  30.       justify their answers)
  31.  
  32. (3)   can plot upsampled sequences again
  33.  
  34. (4)   unified piecewise convolution (either function can be in list
  35.       or expression form)
  36.  
  37. (5)   added many transform pairs to the continuous-time Fourier transform
  38.       rule bases CTFTransform and InvCTFTransform
  39.  
  40. (6)   the Fourier transform rule bases now handle the convolution operator:
  41.       CTFTransform[ Convolve[t][CPulse[1, t + 1/2], CPulse[1, t + 1/2]], t, w ]
  42.  
  43. (7)   RootLocus plots a root locus for one varying parameter
  44.  
  45. (8)   CFIR and CIIR structures have an optional third argument: Roots -> roots.
  46.       Change is reflected in AnalogFilters notebook.
  47.  
  48. (9)   Computational objects for IIR structures, called IIRFunction, now exist.
  49.       Also, FIR structures can be rewritten as a formula.  Their values
  50.       can now be plotted.  Values are calculated as they are needed, and
  51.       IIRFunction remembers (caches) previous calculations.
  52.  
  53. (10)  SequencePlot now provides a standard way to plot discrete-time expressions
  54.  
  55. (11)  Mathematica 1.2 has a problem performing partial fractions decomposition
  56.       on real-valued polynomials even if you do all the factoring yourself.
  57.       So, we have added a new option to the InvLaPlace object called Apart.
  58.       If set to All, then we kludge around the Apart deficiency so that
  59.       a partial fractions decomposition is formed.  Otherwise, we inverse
  60.       transform the function as an continuous-time IIR filter whose input
  61.       is the inverse transform of the numerator.  This is made possible
  62.       by a new function called MyApart (see below).
  63.  
  64. (12)  The z-transform of IIR structures returns a valid region of convergence.
  65.  
  66. (13)  RealQ[z] returns True if and only if the head (tag) of z is Real.
  67.       We have added RealValuedQ[z] which returns True if the imaginary
  68.       component of z is 0 or 0.0 (this behaves the way RealQ used to).
  69.  
  70.  
  71. -------------------------- Version 2.1 ----------------------------------
  72.  
  73. (14)  ZSolve, a difference equation solver, is more robust.  ZSolve can
  74.       also justify its answers in the same way as the transforms do.
  75.  
  76. (15)  DTFT of Step[n] is now correct (was missing a pi term).
  77.  
  78. (16)  LSolve can also justify its answers in the same way as the transforms do.
  79.  
  80. (17)  Convolution is now represented by more than one operator.
  81.       Linear convolution in the discrete domain is Convolve[n] and
  82.       linear convolution in the continuous domain is CConvolve[t].
  83.  
  84.  
  85. -------------------------- Version 2.2 ----------------------------------
  86.  
  87. (18)  Discrete-time convolution is now implemented.
  88.  
  89. (19)  New notebook called "SignalProcessingIntroduction" serves as an
  90.       introduction to Mathematica as well as DSP.
  91.  
  92. -------------------------- Version 2.21 ---------------------------------
  93.  
  94. (20)  SequencePlot for 2-D signals now samples functions at integer
  95.       indices.
  96.  
  97. -------------------------- Version 2.22 ---------------------------------
  98.  
  99. (21)  Stable will resolve stability of non-separable signals more often
  100.       (e.g., Stable will return False when applied to the z-transform of
  101.              (1/2)^n1 (4/5)^n2 Multinomial[n1,n2] Step[n1,n2]
  102.       instead of an unresolved expression.)
  103.  
  104. -------------------------- Version 2.23 ---------------------------------
  105.  
  106. (22)  Cleaned up descriptions and implementation of parameterized operators
  107.       like Shift, Upsample, and Z.
  108.  
  109.  
  110. -------------------------- Version 2.3 ----------------------------------
  111.  
  112. (23)  The TransformLookup option for the transform rule bases allows one
  113.       to specify additional transform pairs.  This is useful when a trans-
  114.       form rule base does not contain a pair that you need.  It is also
  115.       useful for transforming abstract functions (i.e., saying that x[n]
  116.       becomes X[z]).  For example,
  117.  
  118.       In:= ZTransform[a^n x[n], n, z, TransformLookup -> { x[n] :> X[z] }]
  119.  
  120.       Out= ZTransData[ X[a z], Rminus[0], Rplus[Infinity], ZVariables[z]]
  121.  
  122.       The N-dimensional case is not as straightforward because each
  123.       transform rule base applies a one-dimensional rule base N times
  124.       in the order that the N time variables are given.  Therefore,
  125.       users must specify intermediate transform pairs:
  126.  
  127.       In:= LaPlace[ x[t1,t2], {t1,t2}, {s1,s2},
  128.                        TransformLookup -> { x[t1,t2] :> X1[s1,t2],
  129.                                             X1[s1,t2] :> X[s1,s2 } ]
  130.       Out= LTransData[ X[s1, s2], Rminus[{0, 0}],
  131.                             Rplus[{Infinity, Infinity}], LVariables[{s1, s2}] ]
  132.   
  133.       Here, X1[s1, t2] denotes the Laplace transform of x[t1,t2] with
  134.       respect to the first variable t1.  It turns out that you could use
  135.       X instead of X1 and the transform will still work out correctly.
  136.       (This has been made simpler---  see Version 2.69).
  137.  
  138. -------------------------- Version 2.31 ---------------------------------
  139.  
  140. (24)  Debugged the TeX forms of the signals (functions) and systems
  141.       (operators) introduced by the signal processing packages, esp.
  142.       their multidimensional forms.
  143.  
  144. (25)  Added AllSubsets function which returns all of the possible subsets
  145.       of a set.  For example, AllSubsets[ {v1,v2,v3} ] returns
  146.       { v1, v2, v3, {v1, v2}, {v1, v3}, {v2, v3}, {v1, v2, v3} }.
  147.       Similarly, AllSubsets[ {v1, v2, v3}, Plus] returns
  148.       { v1, v2, v3, v1 + v2, v1 + v3, v2 + v3, v1 + v2 + v3 }.
  149.  
  150. -------------------------  Version 2.32  --------------------------------
  151.  
  152. (26)  The Laplace transform of (t - 1) CStep[t] was incorrect.  It returned
  153.       the same transform as (t - 1) CStep[t - 1] did.  One rule was patched
  154.       in "LaPlace.m".
  155.  
  156. (27)  The inverse Laplace transform cannot handle complex-valued roots
  157.       of a rational polynomial because of limitations of 1.2 Mathematica's
  158.       Apart function.  We have encoded a new function MyApart which
  159.       works around the problem but it is very, very slow.  Now, inverse
  160.       transforms of functions like "s / ( s^2 + 4 )^2" are possible.
  161.  
  162. -------------------------  Version 2.33  --------------------------------
  163.  
  164. (28)  The inverse Laplace transform was not always correctly inverting
  165.       terms that corresponded to integration in the time domain.  Patched
  166.       one rule and added another to the post-processing rules.
  167.  
  168. (29)  The primitive MyApart did not normalize the coefficient of the
  169.       highest power term in the denominator before rooting it.
  170.  
  171. -------------------------  Version 2.34  --------------------------------
  172.  
  173. (30)  The inverse Laplace transform was still not always correctly inverting
  174.       terms that corresponded to integration in the time domain.  Patched
  175.       one rule and added another to the post-processing rules.
  176.  
  177. -------------------------  Version 2.4  --------------------------------
  178.  
  179. (31)  Integrating Delta functions over a finite interval did not work
  180.       when the coefficient on the variable was one.  Fixed.
  181.  
  182. (36)  The routines supporting the rules for multirate multidimensional
  183.       signal processing (i.e., lattice and integer matrix theory) have
  184.       been gathered in "Multirate.m" in the Support directory, including
  185.       "DistinctCosetVectors", "SmithNormalForm", and "SmithReducedForm".
  186.  
  187. (33)  Inverse z-transforms of affine log functions are fixed.
  188.  
  189. (34)  WORKS UNDER ALL VERSIONS OF MATHEMATICA NOW!!!!!
  190.       In making sure that the signal processing packages work for BOTH
  191.       Mathematica 1.2 and 2.0, the following changes have taken place:
  192.       (a) aliases have been discontinued so the former aliased objects
  193.           AliasedSinc, AliasSinc, ASinc, InverseLaPlaceTransform,
  194.           LaPlaceTransform, and MagnitudePhasePlot are now set equal to
  195.           Dirichlet, Dirichlet, Dirichlet, InvLaPlace, LaPlace, and
  196.           MagPhasePlot, respectively.  Pretty much a transparent change.
  197.           Added new alias:  RootLocusPlot for RootLocus.
  198.       (b) Mathematica 2.0 has a new undocumented function called ListQ
  199.           which replaces the one provide by us (our definition for ListQ
  200.           is still used for Mathematica 1.2 and lower).
  201.       (c) Mathematica 2.0 represents collections (headless expressions
  202.           like "(0,2,1,0)") using the head (data tag) Sequence.
  203.           So, ToCollection has been modified to return a collection
  204.           with the proper syntax under both Mathematica 1.2 and 2.0.
  205.           As an indirect result, the functions GetAllExponents and
  206.           GetAllFactors have been rewritten to return lists instead
  207.           of collections.  We have removed the function ExtractVariables,
  208.           but GetVariables was kept so use it instead.
  209.       (d) The evaluation strategy for the Which construct has changed.
  210.           Now, each conditional statement in the construct MUST evaluate
  211.           to True or False.  We now force all of our Which conditional
  212.           statements to evaluate to True or False by using TrueQ.
  213.  
  214. (35)  Mathematica 2.0 offers the DeclarePackage which allows one to specify
  215.       the objects defined by a package.  That way, when a user invokes
  216.       a new primitive, Mathematica 2.0 will automatically load the
  217.       package that defines it and then continue evaluating the expression.
  218.       This works for most objects but does not handle the case where
  219.       additional packages build up a definition incrementally.
  220.       The initialization files "Analog.m", "Digital.m", and "Support.m"
  221.       now only define the ``stubs'' for the objects in the analog, digital,
  222.       and support signal processing packages, respectively.  This means
  223.       that you can place Needs[ "SignalProcessing`SignalProcessing`" ]
  224.       in the initialization file without noticeably slowing down the
  225.       initialization process.  That way, students can go about their
  226.       business without having to know which packages to load in beforehand.
  227.  
  228. (36)  One warning about Mathematica 2.0:  it now assumes that variables
  229.       represent complex (instead of real) numbers, so Sqrt[x^2] remains
  230.       unsimplified.  Although this is usually beneficial, this assumption
  231.       sometimes clashes when you want to treat a variable as real-valued.
  232.       For example, Plot[ x^(1/3), {x, -5, 5} ] cannot handle x in [-5, 0)
  233.       because it takes the wrong branch cut at the origin which can be
  234.       seen by plotting the real part of x^(1/3).  It does plot the
  235.       correct curve over x in [0, 5].
  236.  
  237. (37)  For the most part, the notebook interface in 2.0 is upwardly
  238.       compatible with that of Mathematica 1.2.  However, 2.0 includes the
  239.       preamble with all PostScript graphics now (an extra 20 kb of
  240.       information per graphics cell) so some of our notebooks, like the
  241.       piecewise convolution, will double in size.  This change caused us
  242.       to break up the z-transform notebook into three notebooks.
  243.  
  244. -------------------------  Version 2.41  --------------------------------
  245.  
  246. (38)  MagPhasePlot no longer generates a "Set::raw" warning message.
  247.       and can plot Delta functions that appear in the frequency response
  248.       (including impulse trains).
  249.  
  250. (39)  The inverse Laplace transform finally works identically under
  251.       Mathematica 1.2 and 2.0.  The main problem was that the partial
  252.       fractions primitive Apart no longer normalized polynomials in
  253.       denominators so the resulting denominators failed to match any
  254.       of the transform pairs.
  255.  
  256. (40)  Added SPSimplify which applies simplification rules for signal
  257.       processing expressions.  It supports a dialogue option.
  258.  
  259. (41)  SequencePlot displays the "lollipops" more boldly and adapts
  260.       their widths according to the number of samples plotted.
  261.  
  262. -------------------------  Version 2.42  --------------------------------
  263.  
  264. (42)  New tutorial notebook on the discrete-time Fourier transform.
  265.  
  266. (43)  SPSimplify failed to return if Dialogue was enabled.
  267.  
  268. (44)  Apart in Mathematica 2.0 does not handle non-rational polynomials
  269.  
  270. (45)  SignalPlot, SequencePlot, and MagPhasePlot are more robust
  271.       under Mathematica 2.0:
  272.  
  273. (46)  ASPAnalyze and DSPAnalyze uses more descriptions for the
  274.       analyses that they perform.  They are also immune to changes
  275.       in the Global environment.
  276.  
  277. -------------------------  Version 2.43  --------------------------------
  278.  
  279. (47)  CTFTransform cannot find SPSimplify.  Fix to BeginPackage.
  280.  
  281. (48)  MagPhasePlot did not handle discontinuities well.  Fixed.
  282.  
  283. (49)  Integral of Delta[t] over a finite interval.  Fixed.
  284.  
  285. (50)  Continuous-time piecewise convolution works again.
  286.  
  287. -------------------------  Version 2.44  --------------------------------
  288.  
  289. (51)  Made the forward and inverse continuous-time Fourier transforms
  290.       use the same set of rules by exploiting the duality property.
  291.  
  292. (52)  Fixed the procedure that normalizes expressions in the inverse
  293.       Laplace transform rule base
  294.  
  295. -------------------------  Version 2.45  --------------------------------
  296.  
  297. (53)  Discrete convolution has been fixed.
  298.  
  299. -------------------------  Version 2.5  ---------------------------------
  300.  
  301. (54)  Discrete and continuous Convolution has been fixed to work when
  302.       one or more endpoints is infinite.
  303.  
  304. (55)  For SequencePlot of 1-D signals, the integer axis now is guaranteed
  305.       to have integer ticks.
  306.  
  307. (56)  RationalGCD accepts the same style as Mathematica's GCD primitive.
  308.       Specifically, RationalGCD no longer accepts a list of elements but
  309.       instead has the form RationalGCD[e1, e2, ...].
  310.  
  311. (57)  Added the Multirate supporting functions ColumnHermiteForm and
  312.       RowHermiteForm as well as LCLM, LCRM, GCRD, and GCLD.
  313.  
  314. (58)  Automatic simplification of expressions is no longer performed, but
  315.       syntax checking is still automatic.  Simplification is now handled
  316.       by SPSimplify which augments the built-in routine Simplify.  There
  317.       are new routines that perform extensive rewriting of signal
  318.       processing expressions as discussed below.
  319.  
  320. (59)  The evaluation of Needs[ "SignalProcessing`ObjectOriented`" ]
  321.       will enable to attachment of properties to (parameterized) operators
  322.       using the routine DefSystem.  The default properties (ASSOCIATIVE,
  323.       LINEAR, SHIFTINVARIANT, etc.) are kept in the variable SPproperties.
  324.       They will have already been attached to Mathematica's built-in
  325.       operators (Re, Im, Conjugate, Plus, and Times) and to the new
  326.       operators (Shift, Upsample, etc.).  Users can attach properties
  327.       to their own or other existing operators.
  328.  
  329. (60)  Syntax checking and simplification rules have already been
  330.       developed for the new signals (functions) and systems (operators).
  331.       We have also developed a comprehensive set of rearrangement
  332.       rules for signals and systems based on their properties.
  333.       These are accessible by the routine SPRecursiveRewrite.  Heuristic
  334.       techniques will be added soon.
  335.  
  336. -------------------------  Version 2.51  --------------------------------
  337.  
  338. (61)  SignalPlot supports exactly the same options as do Plot and Plot3D.
  339.       Signal plots look better, too.
  340.  
  341. (62)  The Laplace transform rule bases now handle the Summation operator.
  342.  
  343. -------------------------  Version 2.52  --------------------------------
  344.  
  345. (63)  Cleaned up definition of the Summation operator and Delta function.
  346.  
  347. (64)  Cleaned up SignalPlot's display of delta functions and a train of
  348.       delta functions.  Updated DeltaPlot, Arrow2D, and SignalPlot.
  349.  
  350. -------------------------  Version 2.53  --------------------------------
  351.  
  352. (65)  Integration rules for Delta functions are now covered by
  353.       DeltaIntegrate.  Users can customize them (but first you
  354.       will need to unprotect it).
  355.  
  356. -------------------------  Version 2.54  --------------------------------
  357.  
  358. (66)  The inverse z-transform can now inverse the forward transform of
  359.       a downsample operation.
  360.  
  361. (67)  The forward and inverse z-transforms handle more cases involving
  362.       the Summation operator.
  363.  
  364. (68)  The forward z-transform handles affine step functions and the
  365.       inverse z-transform more cleanly works around the shortcomings
  366.       of Mathematica's Apart primitive by relying on MyApart to invert
  367.       those transforms than Apart cannot handle.
  368.  
  369. (69)  Integration is now more robust for expressions involving continuous
  370.       step (CStep) functions and continuous pulse (CPulse) forms.
  371.  
  372. (70)  A minor adjustment was made to DistinctCosetVectors function.
  373.  
  374. -------------------------  Version 2.55  --------------------------------
  375.  
  376. (71)  Provided a "master" file for the signal processing extensions as
  377.       to be compatible with the convention used by Mathematica's
  378.       standard packages:  use Needs["SignalProcessing`Master`"]
  379.  
  380. (72)  Inverse z-transform of the forward z-transform of Sin[b n] Step[n]
  381.       returns Sin[b n] Step[n] as it used to do.  The sequence of steps for
  382.       the inverse z-transform has changed.
  383.  
  384.       OLD ORDER:  rational pairs, non-rational pairs, partial fractions,
  385.                   pick off constants, additivity, delays, partial fractions
  386.                   (again), logarithm properties, downsampled sequence,
  387.                   multiplication by a^n, ....
  388.  
  389.       NEW ORDER:  rational pairs, non-rational pairs, downsampled sequence,
  390.                   additivity in form of summation operator,
  391.                   multiplication by a^n, pick off constants, delays,
  392.                   additivity, normalize denominator, partial fractions,
  393.                   additivity in numerator, logarithm properties, ...
  394.  
  395. (73)  The routine TheFunction that converts signal processing expressions
  396.       to formulas has been extended.
  397.  
  398. (74)  GetAllFactors, the function that helps determine if a variable
  399.       in an expression has been scaled, is more robust.  This helps the
  400.       inverse z-transform properly handle the z-transform of functions
  401.       like a^n Sin[b n] Step[n].  I have also improved ScalingFactor
  402.       and UpsampleFactor so that the factors returned are independent
  403.       of the variable being checked.
  404.  
  405. -------------------------  Version 2.6  --------------------------------
  406.  
  407. (75)  Introduced a heuristic to apply rewrite rules intelligently
  408.       called SPHeuristicRewrite.
  409.  
  410. (76)  CirclePS, used by the pole-zero plotting routine, now uses the
  411.       built-in Graphics primitive Circle.
  412.  
  413. (77)  The inverse Laplace transform produces right-sided transforms
  414.       more often.  The problem was in Mathematica 2.0 because Apart
  415.       (and therefore MyApart) does not normalize the denominator(s)
  416.       after partial fractions.  Also, the Similarity Property is
  417.       correctly implemented as only to allow f(cs) to be rewritten
  418.       when c > 0.
  419.  
  420. (78)  Regardless of the value of the Dialogue option, the transform
  421.       rule bases will keep track of the assumptions made on the free
  422.       parameters.  They can be retrieved at any time by evaluating
  423.       Assuming[All].  The set of conditions can be cleared by 
  424.       evaluating Assuming[].
  425.  
  426. (79)  The transform rule bases now print out assumptions made
  427.       on parameters if the Dialogue option is set to All.
  428.  
  429. (80)  SignalPlot and SequencePlot handle periodic functions better,
  430.       so Summation[i, -Infinity, Infinity, 1][CStep[1, t + 2 i]], or
  431.       alternately Periodic[2,t][CStep[1,t]], plots correctly.
  432.  
  433. (81)  The TransformLookup option is more robust for all transforms.
  434.  
  435. (82)  You can now specify a list of symbols to treat as variables to
  436.       SPSimplify by using the Variables option.
  437.  
  438. (83)  Improved DTFT Notebook that introduces Fourier analysis of
  439.       sequences, the DTFT, and the DFT.
  440.  
  441. -------------------------  Version 2.61  --------------------------------
  442.  
  443. (84)  The user-specified transform pairs are now put at the beginning
  444.       of the rule base so that they override the built-in knowledge
  445.       and they appear in proper order during dialogue.  As a consequence,
  446.       the forward and inverse Fourier transforms now properly handle
  447.       the TransformLookup option for specifying new transform pairs.
  448.  
  449. (85)  The inverse z-transform can handle downsampled and upsampled
  450.       signals again.
  451.  
  452. (86)  The assumptions made on free parameters during the taking of a
  453.       linear transforms are displayed in a more meaningful way.
  454.  
  455. (87)  New operator called CircularShift which is an abstract form of
  456.       the primitive RotateRight.  It was introduced because of the
  457.       new DFT transform pairs written into the DFT rule bases.
  458.  
  459. (88)  I have idiot-proofed the transform rule bases.  So, if you typed
  460.       something like LaPlace[ CStep[t], t s ] it would complain about
  461.       t s because you meant t, s.  This should help new users.
  462.  
  463. -------------------------  Version 2.62  --------------------------------
  464.  
  465. (89)  The MagPhasePlot routine now takes the same options as Plot does.
  466.       Furthermore, it works better under Mathematica 2.0.
  467.  
  468. (90)  The notation for PolyphaseDownsample and PolyphaseUpsample has
  469.       changed to include the filter as a parameter.  These operators
  470.       are now single input, single output operators.
  471.  
  472. (91)  The rearrangement rules contained in SystemRewriteRules have been
  473.       debugged, including the m-D versions of Crochiere and Rabiner's
  474.       rules for 1-D multirate signal processing.  Some rules were added.
  475.  
  476. -------------------------  Version 2.63  --------------------------------
  477.  
  478. (92)  All of the system rearrangement and simplification rules listed
  479.       in Appendix D of Myers' MIT thesis have been encoded in their
  480.       original 1-D forms.  The multidimensional analogs have been
  481.       developed and encoded as well.
  482.  
  483. (93)  ConvertToList, which converts an algebraic form of a (piecewise)
  484.       function into a list of F-intervals, is more robust.  It now
  485.       properly converts functions like the trapezoid function defined by
  486.  
  487.           (t+1) u(t+1) - t u(t) - (t-1) u(t - 1) + (t-2) u(t-2)
  488.  
  489.       where u(v) is the continuous step function.  Before, it would
  490.       have claimed that this function had infinite extent when in fact
  491.       its extent is from t=-1 to t=2 inclusive.
  492.  
  493. (94)  Renamed "Multirate.m" as "LatticeTheory.m" and made the package
  494.       independent from other signal processing packages.
  495.  
  496. (95)  added the number theoretic EuclidFactors to complement the routine
  497.       BezoutNumbers.  BezoutNumbers finds integers mu and lambda given
  498.       integers a and b such that
  499.  
  500.                      a mu + b lambda == gcd(a,b)
  501.  
  502.       (BezoutNumbers calls the Mathematica primitive ExtendedGCD.)
  503.       EuclidFactors finds the integers mu and lambda given relatively
  504.       prime integers p and q and any integer k so that
  505.  
  506.                        p mu + q lambda == k
  507.  
  508.       EuclidFactors also works when p and q are integer matrices (in
  509.       which case mu, lambda, and k become integer vectors).
  510.  
  511. -------------------------  Version 2.64  --------------------------------
  512.  
  513. (96)  One of the simplification rules that handles the conjugation of
  514.       complex exponentials dropped terms.  It is fixed.  Also, more
  515.       simplification rules for complex exponentials have been added.
  516.      
  517. (97)  Under Mathematica 2.0, SPSimplify did not support the Trig option
  518.       that Simplify supports.
  519.  
  520. (98)  For 1-D signals and sequences, SequencePlot and SignalPlot will
  521.       plot a list of them on the same graph.
  522.  
  523. (99)  ZSolve switched the driving function and the difference equation
  524.       when there were no initial conditions.
  525.  
  526. (100) The continuous Fourier transform can handle filter sections again
  527.       and even returns the proper region of convergence.
  528.  
  529. -------------------------  Version 2.65  --------------------------------
  530.  
  531. (101) Made RootLocus faster and more robust.
  532.  
  533. (102) 2-D pole-zero root locus plots handle non-separable polynomials.
  534.  
  535. (103) The DFT of impulses is faster
  536.  
  537. (104) GetShiftFactor computes shift factors in an expression for a
  538.       given variable.
  539.  
  540. (105) The inverse Laplace transform rule base better handles shifts in
  541.       the Laplace variable.  For example, s is shifted by b below:
  542.  
  543.       InvLaPlace[ Sqrt[Pi] Exp[-2 Sqrt[a] Sqrt[b + s] / Sqrt[b + s], s ]
  544.        -(a/t) - b t
  545.       E             CStep[t]
  546.       ----------------------
  547.             Sqrt[t]
  548.  
  549. (106) The forward and inverse DFT, DTFT, and Laplace transform rule
  550.       bases support an option called Definition.  If set to True, then
  551.       the rule base will apply the definition of the transform if all
  552.       other attempts at the transform have failed.
  553.  
  554. -------------------------  Version 2.66  --------------------------------
  555.  
  556. (107) The convolution routines simplify expressions involving Delta and
  557.       Impulse functions.
  558.  
  559. (108) The Definition option has been implemented for the z- and Fourier
  560.       transforms so now all of the rule bases have this option.
  561.  
  562. -------------------------  Version 2.67  --------------------------------
  563.  
  564. (109) When the Fourier transform cannot find a transform, it will try to
  565.       apply the definition before it calls the Laplace transform rule
  566.       bases.  Also, the extra comma introduced in Version 2.66 at the
  567.       end of the list of the Fourier transform rules has been removed.
  568.  
  569. -------------------------  Version 2.68  --------------------------------
  570.  
  571. (110) The forward z-transform recognizes common shifts in the discrete-
  572.       time variable, e.g. (n + 1) f[n + 1].
  573.  
  574. (111) Introduced ZPolynomial[m, n] which is an mth degree polynomial in n.
  575.       It implements the property that the inverse z-transform of the mth
  576.       derivative of F(z) is ZPolynomial[m, n] times f[n] shifted by m.
  577.  
  578. (112) Simplification of conjugated polynomials carried out by SPSimplify
  579.       has been enhanced.  It now will show that H(z) = H*(z*) when H(z)
  580.       is a rational polynomial having real-valued poles and zeroes.
  581.  
  582. (113) PoleZeroPlot shades regions of convergence for the s-domain.
  583.       Also, the DisplayFunction option is properly support so that
  584.       you can redirect the output of the pole-zero plot to file via
  585.  
  586.       PoleZeroPlot[ s / ((s+1)(s+2)), s, -3, -2, False,
  587.                     DisplayFunction -> ( Display["pzplot1.mps", #1]& ) ]
  588.  
  589. (114) SignalPlot for 1-D signals was generating the correct graphics
  590.       but not plotting them on the screen.  Fixed.
  591.  
  592. -------------------------  Version 2.7   --------------------------------
  593.  
  594. (115) Using the TransformLookup option for multidimensional transforms
  595.       is now as straightforward as saying x[n1,n2] :> X[z1,z2], i.e.
  596.       intermediate transform pairs (one per dimension) do not have
  597.       to be specified.
  598.  
  599. (116) The forward z-transform now transforms multidimensional upsampled
  600.       and downsampled functions and properly adjusts the region of
  601.       convergence.  It also handles transforms of expressions like
  602.       Upsample[l1,n1][ Upsample[l2,n2][ x[n1,n2 ] ]:
  603.  
  604.       In:= ZTransform[ Upsample[l1,n1][ Upsample[l2,n2][ x[n1,n2] ] ],
  605.                        {n1,n2}, {z1, z2},
  606.                        TransformLookup -> { x[n1,n2] :> X[z1,z2] } ]
  607.                            l1    l2
  608.       Out= ZTransData[ X[z1  , z2  ], Rminus[{0, 0}], 
  609.                        Rplus[{Infinity, Infinity}], ZVariables[{z1, z2}] ]
  610.  
  611. (117) The forward DTFT handles multidimensional upsampled and downsampled
  612.       signals.  It also inverse transforms upsampled signals such as the
  613.       diamond tile CPulse[2 Pi, w1 + w2 + Pi] CPulse[2 Pi, w1 - w2 + Pi]
  614.       which is Upsample[{{1,1},{-1,1}}. {n1,n2}][ Sinc[Pi n1] Sinc[Pi n2] ]
  615.       in the discrete-time domain.
  616.  
  617. (118) Discontinued the functions MyTogether, NegExponent, and NormalizedQ.
  618.  
  619. (119) GetAllFactors, the function that helps determine if a variable has
  620.       been scaled in an expression, has been made more robust (again).
  621.       It is used by the z and Laplace transforms.
  622.  
  623. (120) Added the System property SEPARABLE
  624.  
  625. (121) The best news is that many of the multidimensional capabilities
  626.       have been decoupled from the signal processing packages so that
  627.       only 1-D and simple m-D operations are initially loaded.  The
  628.       packages will load in m-D extensions to existing operators
  629.       (e.g., z-transforms of multidimensional resampled signals) as
  630.       needed.  This strikes a balance in its use by researchers and
  631.       students.  That is, the SPP initial load the facilities useful
  632.       to undergraduates.  Additional features are loaded as needed.
  633.  
  634. (122) SPSimplify works around an infinite loop in Mathematica's Simplify
  635.       command.  This error in Simplify causes both LSolve and DSolve to
  636.       hang when solving some first-order DE's.  LSolve no longer hangs
  637.       because it uses SPSimplify.
  638.  
  639. (123) Analog filters can now be specified completely by their poles.
  640.       CIIR[t, Roots -> {-1, -2, -3}] would compute the missing coefficient
  641.       list from the poles:  CIIR[t, {6, 11, 6, 1}].  Similiarly,
  642.       CFIR[t, Roots -> {-1, 0, 1}] gives CFIR[t, {0, -1, 0, 1}].
  643.  
  644. (124) The time responses of analog filters can be plotted.
  645.  
  646. (125) By default, MyApart will now root denominators of higher than
  647.       fifth order numerically.
  648.  
  649. -------------------------  Version 2.71  --------------------------------
  650.  
  651. (126) When an improper region of convergence is given to PoleZeroPlot,
  652.       it will now display a union of all possible combinations.
  653.  
  654. (127) All linear symbolic transforms (z, LaPlace, etc.) are faster---
  655.       the efficiency increase is proportional to the size of the
  656.       expression being transformed.  The speed of the transformation
  657.       is now independent of the size of local information associated
  658.       with each sub-expression.
  659.  
  660. (128) The symbolic DFT is more robust.
  661.  
  662. -------------------------  Version 2.72  --------------------------------
  663.  
  664. (129) The signal processing Notebooks are finally compatible with the
  665.       two versions of Mathematica (1.2/2.0).
  666.  
  667. (130) Inverse DTFT's of transforms that are upsampled in the time domain
  668.       now work under 2.0.
  669.  
  670. (131) Values for signals that are upsampled in multidimensions can now
  671.       be computed and plotted, e.g.
  672.  
  673.       SequencePlot[ Upsample[{{1, 1},{-1, 1}}, {n1,n2}][ Abs[n1 + n2] ],
  674.                     {n1, 0, 9}, {n2, 0, 9} ]
  675.  
  676. (132) ASPAnalyze does a better job analyzing simple functions like sin(t).
  677.  
  678. (133) The continuous-time Fourier transform communicates better with
  679.       the Laplace transform rule base so more transforms can be resolved.
  680.       Also, many CTFT transform pairs were fixed and enhanced.
  681.  
  682. (134) Magnitude responses involving Dirac delta functions are properly
  683.       displayed again.
  684.  
  685. -------------------------  Version 2.73  --------------------------------
  686.  
  687. (135) The plotting routines are now uniform in the way they convert Delta
  688.       Delta functions, infinite summations, periodic operators, and other
  689.       oddities into standard Mathematica expressions.  The Extent1D
  690.       routine has been improved and the SignalCleanup routine has been
  691.       introduced.
  692.  
  693. (136) The Aliasby operator is now always rewritten in terms of the
  694.       Periodic operator.
  695.  
  696. (137) The discrete-time Fourier transform (DTFT) has been made 
  697.       "mathematically correct" in that the forward transforms track
  698.       the inherent periodicity.  Normally, DTFT's are periodic with
  699.       a period of 2 Pi, but resampled signals exhibit different
  700.       periodicities.
  701.  
  702. (138) The filter design routines automatically load additional routines
  703.       when necessary.
  704.  
  705. (139) PlotList has now been aliased to PiecewisePlot so as to reduce the
  706.       confusion with ListPlot.
  707.  
  708. -------------------------  Version 2.74  --------------------------------
  709.  
  710. (140) There is a new global variable called $DeltaFunctionScaling that
  711.       controls how the height of Delta functions are to be plotted.
  712.       The heights are either scaled to be proportional to the areas
  713.       under the Delta functions (Scaled) or are set to maximum value
  714.       of the rest of the plot.  The default option is Scaled which is
  715.       the way students learn to plot Delta functions.
  716.  
  717. (141) Arrows representing Delta functions are drawn in a more uniform way.
  718.       Downward and upward arrows are drawn according to the sign of the
  719.       fourth parameter to Arrow2D.
  720.  
  721. (142) Sampling with infinite impulse trains is now implemented as a part
  722.       of the forward and inverse Fourier transform rule bases.  Infinite
  723.       impulse trains in continuous time are represented either as
  724.       Summation[n, -Infinity, Infinity, 1][Delta[t + T n]] or as
  725.       Periodic[T,t][Delta[t]] where T is the sampling period, n is an
  726.       integer (index) variable, and t is the continuous-time variable.
  727.  
  728. -------------------------  Future Plans  --------------------------------
  729.  
  730. (143) The old way to convert signal processing expressions to formulas was
  731.       to use TheFunction.  That is still supported, but the functionality
  732.       of TheFunction has been transferred to Mathematica's Normal routine.
  733.  
  734. (144) Upsample and Downsample should take an optional third argument,
  735.       namely a reindexing symbol.
  736.  
  737. (145) Generating C/SPOX code for algorithms
  738.  
  739. (146) Providing an algorithm design environment for linear multidimensional
  740.       multirate systems (at the level of saying "write thesis")
  741.  
  742. Because of changes (1), (5), and (6), we can recreate (for the
  743. most part) the pictorial dictionary of Fourier transforms in
  744. chapter 19 of Bracewell's book entitled "The Fourier Transform and
  745. Its Applications".
  746.  
  747. Because of changes (9) and (12) and because of subtle modifications to
  748. the ExtractVariables object, DSPAnalyze now works correctly for
  749. IIR and FIR structures.
  750.  
  751. I have included a release of all of the files that compose the
  752. signal processing packages.  We have updated all of the notebooks
  753. because of the above changes.  We have included all eight notebooks.
  754.  
  755. The signal processing packages alter these standard Mathematica functions:
  756.  
  757. (a) Integrate so that it can handle generalized functions like the
  758.     Dirac delta (Delta) and functions with discontinuities like
  759.     continuous-time step (CStep) and pulse (CPulse) functions.
  760. (b) Simplify applied to an And expression removes redundant conditions
  761. (c) Det of a number is that number
  762. (d) Dot product of two numbers is the product of the two numbers
  763. (e) The TeX forms of Re and Im primitives are Re and Im instead of
  764.     R and I.
  765. (f) Under Mathematica 2.0, the default options for the Limit operator have
  766.     been changed to { Analytic -> True, Direction -> Automatic }.
  767.